home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / assembly / 3d_starfield.lha / 3d_starfield.s < prev    next >
Encoding:
Text File  |  1994-06-05  |  4.5 KB  |  269 lines

  1.     Section    Demo,Code_C
  2.  
  3.     Opt    C-,O+,w-
  4.  
  5. numberofstars    = 200
  6. star_speed        = 8
  7.     
  8. Start:    lea    $dff000,a5        ; hardware base address
  9.  
  10.     Move.w    $1c(a5),OldInt    ; Save Old Interupts
  11.     Move.w    $02(a5),OldDma    ; Save Old DMA
  12.  
  13.     Move.w    #$7fff,$9a(a5)    ; Clear DMA
  14.     Move.w    #$7fff,$96(a5)    ; Clear Interupts
  15.     Move.w    #$7fff,$9c(a5)    ; Clear Interupt Requests
  16.  
  17.     move.w    #59,d7
  18. .loop    move.w    $dff006,$dff180
  19.     bsr    starfield
  20.     dbf    d7,.loop
  21.  
  22.     
  23.     Move.b    #$7f,$bfed01    ; kill timers (rem me for disk)
  24.     Move.l    $6c.w,OldV3        ; save level 3 int
  25.  
  26.     Move.l    #my_level3,$6c.w    ; put new copper interupt
  27.     Move.l    #my_copper,$80(a5)     ; Address of copper 1
  28.     Move.w    #$c010,$9a(a5)    ; Start interupts
  29.  
  30.     Move.w    #$83ef,$96(a5)    ; Start DMA ( 83ff for disk dma)
  31.     Move.w    #1,$88(a5)        ; Strobe for copper start
  32.  
  33.     move.l    #screen1,d0
  34.     move.w    d0,bitplane0_lo
  35.     swap    d0
  36.     move.w    d0,bitplane0_hi
  37.     move.l    #screen2,d0
  38.     move.w    d0,bitplane1_lo
  39.     swap    d0
  40.     move.w    d0,bitplane1_hi
  41.  
  42. wait:    btst    #6,$bfe001
  43.     bne.s    wait        ; wait for lmb
  44.  
  45.     lea    $dff000,a5        ; hardware base address
  46.     move.l    #0,$80(a5)        ; blank copper list
  47.     move.l    #0,$84(a5)        ; if gfx lib not open (slayer boot)
  48.     move.w    #0,$180(a5)        ; bgc to black
  49.     
  50.     Move.l    OldV3,$6c.w        ; restore old l3
  51.     
  52.     Lea    GfxLib,a1        ; Pointer to Library Text
  53.     move.l    4.w,a6
  54.     jsr    -132(a6)        ; forbid
  55.     Move.l    4.w,a6        ; Exec
  56.     Moveq.l    #0,d0        ; Clear D0
  57.     Jsr    -$228(a6)        ; Open Library
  58.     cmp.l    #0,d0
  59.     beq    no_gfx_lib        ; if gfx lib not open dont restore copper lib (slayer boot)
  60.     
  61.     Move.l    d0,a1            
  62.     Move.l    $26(a1),$80(a5)    ; restore copper 1
  63.     Move.l    $32(a1),$84(a5)    ; restore copper 2
  64. no_gfx_lib:
  65.  
  66.     Move.w    OldInt,d0        ; start old interupts
  67.     Or.w    #$8000,d0
  68.     Move.w    d0,$9a(a5)
  69.     Move.w    OldDma,d0        ; start old DMA
  70.     Or.w    #$8000,d0
  71.     Move.w    d0,$96(a5)
  72.     Move.b    #$9b,$bfed01    ; Start Timers
  73.     Move.l    4.w,a6        ; Close Gfx lib
  74.     Jsr    -$19e(a6)
  75.     move.l    4.w,a6
  76.     jsr    -138(a6)        ; permit
  77.  
  78.     move.w    #0,$bfec00        ; clear kbd
  79.  
  80.     Moveq.l    #0,d0        ; No errors
  81.     Rts            ; Exit
  82.  
  83.  
  84. my_level3:
  85.     Movem.l    d0-d7/a0-a6,-(a7)    ; New copper
  86.     Move.w    #$10,$dff09c    ; Serviced Interupt
  87.  
  88.     bsr    starfield
  89.     ;move.w    #$444,$dff180
  90.  
  91.  
  92. Exit:    Movem.l    (a7)+,d0-d7/a0-a6
  93.     Rte            ; Return from Interupt
  94.  
  95.     *********
  96.  
  97. starfield:    movem.l    d0-d7/a0-a6,-(a7)
  98.  
  99.     lea    starsxpos,a4
  100.     move.l    #numberofstars,d3    
  101.     lea    starsypos,a5
  102.     lea    mul40,a6
  103.  
  104.     lea    screen1,a0
  105.     lea    screen2,a2
  106.  
  107. starsloop:    move.w    (a4)+,d4        ; x
  108.     move.w    (a4)+,d5        ; y
  109.     move.w    (a4),d6        ; z
  110.  
  111.     sub.w    #star_speed,(a4)+
  112.     tst.w    d6
  113.     ble    tobig
  114.  
  115.     ext.l    d4        ; depth calc
  116.     divs    d6,d4
  117.     ext.l    d5
  118.     divs    d6,d5
  119.  
  120.     add.w    #160,d4        ; xpos (centre field)
  121.     add.w    #120,d5        ; ypos (centre field)
  122.     
  123.     tst.w    d4
  124.     blt    tobig
  125.     tst.w    d5
  126.     blt    tobig
  127.     cmp.w    #320,d4
  128.     bgt    tobig
  129.     cmp.w    #245,d5
  130.     bgt    tobig
  131.     
  132.     lsl.w    #1,d5
  133.     move.w    (a6,d5),d5
  134.     move.w    d4,d7
  135.     lsr.w    #3,d4        ; x 8
  136.     add.w    d4,d5
  137.     not.b    d7
  138.     
  139.     move.w    (a5),d0
  140.     move.w    d5,(a5)+
  141.     move.w    (a5),d1
  142.     move.w    d7,(a5)+
  143.     
  144.     move.l    a0,a1
  145.     bclr    d1,(a1,d0.w)
  146.     move.l    a2,a1
  147.     bclr    d1,(a1,d0.w)
  148.  
  149.     move.l    a0,a1    
  150.     cmp.w    #400,d6
  151.     bgt    stars_depth1
  152.  
  153.     cmp.w    #200,d6
  154.     bgt    stars_depth2
  155.  
  156.     move.l    a0,a1
  157.     bset    d7,(a1,d5)
  158.     move.l    a2,a1
  159.     bset    d7,(a1,d5)
  160.  
  161. starscont:
  162.     dbf    d3,starsloop
  163.  
  164.     move.w    (a5)+,d0
  165.     move.w    (a5),d1
  166.  
  167.     move.l    a0,a1
  168.     bclr    d1,(a1,d0.w)
  169.     move.l    a2,a1
  170.     bclr    d1,(a1,d0.w)
  171.  
  172.     movem.l    (a7)+,d0-d7/a0-a6
  173.     rts
  174.  
  175. stars_depth2:
  176.     move.l    a2,a1
  177. stars_depth1:
  178.     bset    d7,(a1,d5)
  179.     bra    starscont
  180.  
  181.  
  182.  
  183. tobig:    bsr    newdepth
  184.     move.w    d0,-6(a4)
  185.     bsr    newdepth
  186.     move.w    d0,-4(a4)
  187.     move.w    startdepth,-2(a4)
  188.     bra    starscont
  189.  
  190. newdepth:    move.w    $dff006,d0
  191.     lea    starsdepth,a3
  192.     muls    (a3),d0
  193.     add.w    $dff006,d0
  194.     move.w    d0,(a3)
  195.     rts
  196.     
  197.  
  198.     *********
  199.  
  200. startdepth:    dc.w    500
  201.  
  202. starsdepth:    ds.l    numberofstars*2
  203. starsxpos:    ds.l    numberofstars*2
  204. starsypos:    ds.l    numberofstars*2
  205.  
  206.  
  207.     *********
  208.     
  209. my_copper:        dc.w    $100,$2200    ; 4 bp - lo res
  210.         dc.w    $104,$a        ; bp control reg
  211.         dc.w    $108,0        ; bp modulo - odd
  212.         dc.w    $10a,0        ; bp modulo - even
  213.         dc.w    $180,0        ; colour 0 to black
  214.         dc.w    $102,0
  215.         dc.w    $1fc,0
  216.         
  217.         dc.w    $08e,$2c81    ; bp window start left
  218.         dc.w    $090,$2cc1    ; bp window bot right
  219.         dc.w    $094,$d0    ; bp stop horz
  220.         dc.w    $92,$38
  221.  
  222.         dc.w    $120,0,$122,0,$124,0,$126,0
  223.         dc.w    $128,0,$12a,0,$12c,0,$12e,0
  224.         dc.w    $130,0,$132,0,$134,0,$136,0
  225.         dc.w    $138,0,$13a,0,$13c,0,$13e,0
  226.         
  227.  
  228.         dc.w      $e0
  229. bitplane0_hi:    dc.w    0,$e2
  230. bitplane0_lo:    dc.w    0,$e4
  231. bitplane1_hi:    dc.w    0,$e6
  232. bitplane1_lo:    dc.w    0
  233.         
  234. cmap:        dc.w    $180,$000
  235.         dc.w    $182,$444
  236.         dc.w    $184,$888
  237.         dc.w    $186,$ccc
  238.  
  239.                 
  240.         dc.w    $ffe1,$fffe    ; end of ntsc screen
  241.         dc.w    $3001,$ff00    ; end of pal screen
  242.         dc.w    $9c,$8010    ; irq set bits - restart copper
  243.         dc.w    $ffff,$fffe    ; end of copper list
  244.  
  245. oldint:        dc.l    0
  246. olddma:        dc.l    0
  247. oldv3:        dc.l    0
  248. gfxlib:        dc.b    "graphics.library",0
  249.         even
  250.         
  251. screen1:        ds.l    10*256
  252. screen2:        ds.l    10*256
  253.  
  254. mul40:    
  255. a set 0
  256.     rept    256
  257.     dc.w    a*40
  258. a set a+1
  259.     endr
  260.  
  261.     end
  262.     
  263.  
  264.  
  265.  
  266.  
  267.  
  268.         
  269.